home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / cbasebal.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  6KB  |  243 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3.  
  4.  
  5. static unsigned char *cbasebal_textram,*cbasebal_scrollram;
  6. static struct tilemap *fg_tilemap,*bg_tilemap;
  7. static int tilebank,spritebank;
  8. static int text_on,bg_on,obj_on;
  9. static int flipscreen;
  10.  
  11.  
  12.  
  13. /***************************************************************************
  14.  
  15.   Callbacks for the TileMap code
  16.  
  17. ***************************************************************************/
  18.  
  19. static void get_bg_tile_info(int tile_index)
  20. {
  21.     unsigned char attr = cbasebal_scrollram[2*tile_index+1];
  22.     SET_TILE_INFO(1,cbasebal_scrollram[2*tile_index] + ((attr & 0x07) << 8) + 0x800 * tilebank,
  23.             (attr & 0xf0) >> 4)
  24.     tile_info.flags = (attr & 0x08) ? TILE_FLIPX : 0;
  25. }
  26.  
  27. static void get_fg_tile_info(int tile_index)
  28. {
  29.     unsigned char attr = cbasebal_textram[tile_index+0x800];
  30.     SET_TILE_INFO(0,cbasebal_textram[tile_index] + ((attr & 0xf0) << 4),attr & 0x07)
  31.     tile_info.flags = (attr & 0x08) ? TILE_FLIPX : 0;
  32. }
  33.  
  34.  
  35.  
  36. /***************************************************************************
  37.  
  38.   Start the video hardware emulation.
  39.  
  40. ***************************************************************************/
  41.  
  42. void cbasebal_vh_stop(void)
  43. {
  44.     free(cbasebal_textram);
  45.     cbasebal_textram = 0;
  46.     free(cbasebal_scrollram);
  47.     cbasebal_scrollram = 0;
  48. }
  49.  
  50. int cbasebal_vh_start(void)
  51. {
  52.     int i;
  53.  
  54.  
  55.     cbasebal_textram = malloc(0x1000);
  56.     cbasebal_scrollram = malloc(0x1000);
  57.  
  58.     bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,   16,16,64,32);
  59.     fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,32);
  60.  
  61.     if (!cbasebal_textram || !cbasebal_scrollram || !bg_tilemap || !fg_tilemap)
  62.     {
  63.         cbasebal_vh_stop();
  64.         return 1;
  65.     }
  66.  
  67.     fg_tilemap->transparent_pen = 3;
  68.  
  69. #define COLORTABLE_START(gfxn,color_code) Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + \
  70.                 color_code * Machine->gfx[gfxn]->color_granularity
  71. #define GFX_COLOR_CODES(gfxn) Machine->gfx[gfxn]->total_colors
  72. #define GFX_ELEM_COLORS(gfxn) Machine->gfx[gfxn]->color_granularity
  73.  
  74.     palette_init_used_colors();
  75.     /* chars */
  76.     for (i = 0;i < GFX_COLOR_CODES(0);i++)
  77.     {
  78.         memset(&palette_used_colors[COLORTABLE_START(0,i)],
  79.                 PALETTE_COLOR_USED,
  80.                 GFX_ELEM_COLORS(0)-1);
  81.     }
  82.     /* bg tiles */
  83.     for (i = 0;i < GFX_COLOR_CODES(1);i++)
  84.     {
  85.         memset(&palette_used_colors[COLORTABLE_START(1,i)],
  86.                 PALETTE_COLOR_USED,
  87.                 GFX_ELEM_COLORS(1));
  88.     }
  89.     /* sprites */
  90.     for (i = 0;i < GFX_COLOR_CODES(2);i++)
  91.     {
  92.         memset(&palette_used_colors[COLORTABLE_START(2,i)],
  93.                 PALETTE_COLOR_VISIBLE,
  94.                 GFX_ELEM_COLORS(2)-1);
  95.     }
  96.  
  97.     return 0;
  98. }
  99.  
  100.  
  101.  
  102. /***************************************************************************
  103.  
  104.   Memory handlers
  105.  
  106. ***************************************************************************/
  107.  
  108. WRITE_HANDLER( cbasebal_textram_w )
  109. {
  110.     if (cbasebal_textram[offset] != data)
  111.     {
  112.         cbasebal_textram[offset] = data;
  113.         tilemap_mark_tile_dirty(fg_tilemap,offset & 0x7ff);
  114.     }
  115. }
  116.  
  117. READ_HANDLER( cbasebal_textram_r )
  118. {
  119.     return cbasebal_textram[offset];
  120. }
  121.  
  122. WRITE_HANDLER( cbasebal_scrollram_w )
  123. {
  124.     if (cbasebal_scrollram[offset] != data)
  125.     {
  126.         cbasebal_scrollram[offset] = data;
  127.         tilemap_mark_tile_dirty(bg_tilemap,offset/2);
  128.     }
  129. }
  130.  
  131. READ_HANDLER( cbasebal_scrollram_r )
  132. {
  133.     return cbasebal_scrollram[offset];
  134. }
  135.  
  136. WRITE_HANDLER( cbasebal_gfxctrl_w )
  137. {
  138.     /* bit 0 is unknown - toggles continuously */
  139.  
  140.     /* bit 1 is flip screen */
  141.     flipscreen = data & 0x02;
  142.     tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  143.  
  144.     /* bit 2 is unknown - unused? */
  145.  
  146.     /* bit 3 is tile bank */
  147.     if (tilebank != ((data & 0x08) >> 3))
  148.     {
  149.         tilebank = (data & 0x08) >> 3;
  150.         tilemap_mark_all_tiles_dirty(bg_tilemap);
  151.     }
  152.  
  153.     /* bit 4 is sprite bank */
  154.     spritebank = (data & 0x10) >> 4;
  155.  
  156.     /* bits 5 is text enable */
  157.     text_on = ~data & 0x20;
  158.  
  159.     /* bits 6-7 are bg/sprite enable (don't know which is which) */
  160.     bg_on = ~data & 0x40;
  161.     obj_on = ~data & 0x80;
  162.  
  163.     /* other bits unknown, but used */
  164. }
  165.  
  166. WRITE_HANDLER( cbasebal_scrollx_w )
  167. {
  168.     static unsigned char scroll[2];
  169.  
  170.     scroll[offset] = data;
  171.     tilemap_set_scrollx(bg_tilemap,0,scroll[0] + 256 * scroll[1]);
  172. }
  173.  
  174. WRITE_HANDLER( cbasebal_scrolly_w )
  175. {
  176.     static unsigned char scroll[2];
  177.  
  178.     scroll[offset] = data;
  179.     tilemap_set_scrolly(bg_tilemap,0,scroll[0] + 256 * scroll[1]);
  180. }
  181.  
  182.  
  183.  
  184. /***************************************************************************
  185.  
  186.   Display refresh
  187.  
  188. ***************************************************************************/
  189.  
  190. static void draw_sprites(struct osd_bitmap *bitmap)
  191. {
  192.     int offs,sx,sy;
  193.  
  194.     /* the last entry is not a sprite, we skip it otherwise spang shows a bubble */
  195.     /* moving diagonally across the screen */
  196.     for (offs = spriteram_size-8;offs >= 0;offs -= 4)
  197.     {
  198.         int code = spriteram[offs];
  199.         int attr = spriteram[offs+1];
  200.         int color = attr & 0x07;
  201.         int flipx = attr & 0x08;
  202.         sx = spriteram[offs+3] + ((attr & 0x10) << 4);
  203.         sy = ((spriteram[offs+2] + 8) & 0xff) - 8;
  204.         code += (attr & 0xe0) << 3;
  205.         code += spritebank * 0x800;
  206.  
  207.         if (flipscreen)
  208.         {
  209.             sx = 496 - sx;
  210.             sy = 240 - sy;
  211.             flipx = !flipx;
  212.         }
  213.  
  214.         drawgfx(bitmap,Machine->gfx[2],
  215.                 code,
  216.                 color,
  217.                 flipx,flipscreen,
  218.                 sx,sy,
  219.                 &Machine->drv->visible_area,TRANSPARENCY_PEN,15);
  220.     }
  221. }
  222.  
  223. void cbasebal_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  224. {
  225.     tilemap_update(ALL_TILEMAPS);
  226.  
  227.     if (palette_recalc())
  228.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  229.  
  230.     tilemap_render(ALL_TILEMAPS);
  231.  
  232.     if (bg_on)
  233.         tilemap_draw(bitmap,bg_tilemap,0);
  234.     else
  235.         fillbitmap(bitmap,Machine->pens[768],&Machine->drv->visible_area);
  236.  
  237.     if (obj_on)
  238.         draw_sprites(bitmap);
  239.  
  240.     if (text_on)
  241.         tilemap_draw(bitmap,fg_tilemap,0);
  242. }
  243.